"""
FastAPI 依赖函数
依赖注入是 FastAPI 的核心特性之一
允许我们在路由函数中自动注入需要的资源（如数据库会话、当前用户等）
"""
from typing import Generator, Optional
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from sqlalchemy.orm import Session

from .database import get_db
from .models.user import User
from .utils.auth import verify_token


# HTTP Bearer token 安全方案
# 用于从请求头中提取 Authorization: Bearer <token>
security = HTTPBearer()


def get_current_user(
    credentials: HTTPAuthorizationCredentials = Depends(security),
    db: Session = Depends(get_db)
) -> User:
    """
    获取当前登录用户

    这是一个依赖函数，FastAPI会自动：
    1. 从请求头提取token
    2. 验证token
    3. 从数据库查询用户
    4. 将用户对象注入到路由函数中

    Args:
        credentials: 从请求头提取的认证信息
        db: 数据库会话（也是通过依赖注入获得）

    Returns:
        User: 当前用户对象

    Raises:
        HTTPException: 认证失败时抛出401错误
    """
    # 验证token并获取用户信息
    token_data = verify_token(credentials.credentials)

    # 从数据库查询用户
    user = db.query(User).filter(User.username == token_data["username"]).first()

    if user is None:
        raise HTTPException(
            status_code=status.HTTP_401_UNAUTHORIZED,
            detail="User not found",
            headers={"WWW-Authenticate": "Bearer"},
        )

    if not user.is_active:
        raise HTTPException(
            status_code=status.HTTP_400_BAD_REQUEST,
            detail="Inactive user"
        )

    return user


def get_current_active_user(current_user: User = Depends(get_current_user)) -> User:
    """
    获取当前活跃用户

    这是对 get_current_user 的进一步封装
    确保用户不仅存在，而且是活跃状态

    Args:
        current_user: 当前用户（通过依赖注入获得）

    Returns:
        User: 当前活跃用户
    """
    if not current_user.is_active:
        raise HTTPException(status_code=400, detail="Inactive user")
    return current_user